#include <iostream>
#include <signal.h>
#include <cassert>
#include <unistd.h>
#include <sys/types.h>
#include <cstring>
using namespace std;

void PrintPending(const sigset_t &pending){
    for(int signo=1;signo<=31;++signo){
        if(sigismember(&pending,signo))cout<<"1";
        else cout<<"0";
    }
    cout<<endl;
}
void sigcb(int signo){
    cout<<"pid为"<<getpid()<<"接收到了"<<signo<<"信号"<<endl;
}
volatile int quit=0;
void handler(int signo)
{
    cout<<"quit from zero to one"<<endl;
    quit=1;
    cout<<quit<<endl;
}
int main(){

    signal(2,handler);

    while(!quit);
 
    cout<<"main formal quit"<<endl;
    // signal(2,sigcb);
    // cout<<"我是一个进程，我的pid为"<<getpid()<<endl;
    // while(true);
    // cout<<"我是一个进程，我的pid为"<<getpid()<<endl;

    // sigset_t set,oset;
    // sigemptyset(&set);
    // sigemptyset(&oset);
    // sigaddset(&set,2);
    // sigaddset(&set,40);

    // sigprocmask(SIG_BLOCK,&set,&oset);

    // while(true);

    // struct sigaction act,oldact;
    // memset(&act,0,sizeof(act));
    // memset(&oldact,0,sizeof(oldact));
    // act.sa_handler = sigcb;
    // act.sa_flags=0;
    // sigemptyset(&act.sa_mask);

    // sigaction(2,&act,&oldact);

    // while(true);

    // sigset_t set,oset;
    // sigemptyset(&set);
    // sigemptyset(&oset);

    // sigaddset(&set,2);

    // sigprocmask(SIG_BLOCK,&set,&oset);

    // int cnt=0;
    // while(true){
    //     sigset_t pending;
    //     sigemptyset(&pending);
    //     int n = sigpending(&pending);
    //     assert(n==0);
    //     (void)n;

    //     PrintPending(pending);
    //     sleep(1);

    //     cnt++;
    //     if(cnt==10){
    //         cnt<<"解除对2号信号的屏蔽"<<endl;
    //         sigprocmask(SIG_SETMASK,&oset,nullptr);
    //     }
    // }

    return 0;
}